Go 并发执行 SQL 小工具
有时希望使用 GORM 时能并发执行 SQL,并能够回滚,这时直接使用 goroutine 开启协程有个很麻烦的问题就是如何收集到异常
所以这时可以使用 Go 自带的并发工具 errgroup.Group
它能很方便的捕获到异常。
package repo
import (
"errors"
"fmt"
"golang.org/x/sync/errgroup"
)
// concurrentExecNoErr 并发执行
func concurrentExecNoErr(fns ...func()) {
var eg errgroup.Group
for _, fn := range fns {
tfn := fn
eg.Go(func() (retErr error) {
defer func() {
if panicErr := recover(); panicErr != nil {
retErr = errors.New(fmt.Sprintf("%v", panicErr))
}
}()
tfn()
return nil
})
}
err := eg.Wait()
panicError(err)
}
func panicError(err error) {
if err != nil {
panic(err)
}
}
使用时只需在传入回调函数就行了,里面可以塞一些 SQL 操作
concurrentExecNoErr(
func() {
// do something...
},
func() {
// do something...
},
func() {
// do something...
},
func() {
// do something...
},
)